package client.functionalities;

import java.io.IOException;

import org.ksoap.SoapObject;
import org.ksoap.transport.HttpTransport;

import client.MorcMIDlet;


public abstract class RemoteFunctionality implements Runnable {
	protected MorcMIDlet midlet;
	private Thread thread;
	protected HttpTransport httpTransport;
	protected SoapObject soapObject;
	private boolean running;
	private final String namespaceURI = "urn:orkutlite:getFriends";
	private final String functionName = "getFriends";
	private final String serverUrl = "http://localhost:8180/orkutlite";	
	public Object data;
	
	/*
	 * addProperties é esperado conter ações do tipo soapObject.addProperty(
	 * String nome, Object valor) específicas do comando.
	 */
	public abstract void addProperties();
	
	/*  
	 * Construtor
	 */
	public RemoteFunctionality(MorcMIDlet m) {
		this.midlet = m;
		this.data = new Object();
	}

	/*
	 * Cria a thread e a inicia
	 */
	public synchronized void start() {
		// Ja recebeu a lista de amigos e pode enviar scraps
		this.running = true;
		this.thread = new Thread(this);
		this.thread.start();
	}
	
	/* 
	 * Ajusta a flag de execução para propósitos de controle no MIDlet
	 */
	public synchronized void stop() {
		this.running = false;
		this.thread.interrupt();
	}
	
	/*
	 * Cria um SoapObject e um HttpTransport. Tenta enviar a informação com as
	 * propriedades do comando e receber os dados resultantes no object data.
	 * @see java.lang.Runnable#run()
	 */
	public void run() {
		this.createConnectionObjects();
		this.addProperties();
		// Os dados são tratados pelo midlet, aqui só armazena :-)
		this.data = send(httpTransport, soapObject);
		
		// Aviso para o midlet que a ação foi executada
		this.stop();
	}

	/*
	 * Auto-explicativo
	 */
	public boolean isRunning() { 
		return this.running; 
	}

	/*
	 * Cria novos objetos usados na conexão
	 */
	private void createConnectionObjects() {
		this.soapObject = new SoapObject(namespaceURI, functionName);
		this.httpTransport = new HttpTransport(serverUrl, namespaceURI);
	}
	
	/*
	 * Retorna possíveis dados resultantes da chamada de call do HttpTransport.
	 */
	private Object send(HttpTransport ht, SoapObject o) {
		Object data = new Object();
		
		try {
			data = ht.call(o);
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		return data;
	}
	
	
}
